package com.module.app.web;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.util.Log;
import android.view.KeyEvent;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.module.app.base.BaseActivity;
import com.module.app.bean.IType;
import com.module.app.base.loadsir.ErrorCallback;
import com.module.app.base.loadsir.LoadingCallback;
import com.module.base.network.exception.ServerException;
import com.module.base.utils.AppUtils;
import com.module.app.R;

public class WebViewActivity extends BaseActivity {

    private static final String TAG = "webView";
    public static final String EXTRA_URL = "url";


    public static void start(Context context, String url) {
        Intent intent = new Intent(context, WebViewActivity.class);
        intent.putExtra(EXTRA_URL, url);
        context.startActivity(intent);
    }

    /**
     * 服务协议
     */
    public static void startService(Context context) {
        switch (AppUtils.getChannel()) {
            case "vivo":
                WebViewActivity.start(context, IType.Url.service_vivo);
                break;
            default:
                WebViewActivity.start(context, IType.Url.service);
                break;
        }
    }

    /**
     * 隐私协议
     */
    public static void startPrivacy(Context context) {
        switch (AppUtils.getChannel()) {
            case "vivo":
                WebViewActivity.start(context, IType.Url.privacy_vivo);
                break;
            default:
                WebViewActivity.start(context, IType.Url.privacy);
                break;
        }
    }


    WebView webview;

    public String url;
    public String title;

    @Override
    public void bingViewModel() {

    }

    @Override
    protected int getLayoutId() {
        return R.layout.app_activity_web;
    }

    @Override
    protected int getErrorViewRes() {
        return R.id.webview;
    }

    @Override
    protected void getIntent(Intent intent) {
        super.getIntent(intent);
        url = intent.getStringExtra(EXTRA_URL);
    }

    @Override
    protected void initView() {
        super.initView();
        webview = findViewById(R.id.webview);
        initWebView();
        showSuccess();
    }

    @Override
    protected void initData() {
        super.initData();
        reload();
    }

    @Override
    public void reload() {
        super.reload();
        webview.loadUrl(url);
    }

    private void initWebView() {
        WebSettings webSettings = webview.getSettings();
//如果访问的页面中要与Javascript交互，则webview必须设置支持Javascript
        webSettings.setJavaScriptEnabled(true);
// 若加载的 html 里有JS 在执行动画等操作，会造成资源浪费（CPU、电量）
// 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可

//设置自适应屏幕，两者合用
        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

//缩放操作
        webSettings.setSupportZoom(true); //支持缩放，默认为true。是下面那个的前提。
        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false，则该WebView不可缩放
        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

//其他细节操作
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        //缓存模式如下：
        //LOAD_CACHE_ONLY: 不使用网络，只读取本地缓存数据
        //LOAD_DEFAULT: （默认）根据cache-control决定是否从网络上取数据。
        //LOAD_NO_CACHE: 不使用缓存，只从网络获取数据.
        //LOAD_CACHE_ELSE_NETWORK，只要本地有，无论是否过期，或者no-cache，都使用缓存中的数据。
        webSettings.setAllowFileAccess(true); //设置可以访问文件
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
    }

    @Override
    protected void initListener() {
        super.initListener();
        webview.setWebViewClient(new WebViewClient() {

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                // 断网或者网络连接超时
                if (errorCode == ERROR_HOST_LOOKUP || errorCode == ERROR_CONNECT || errorCode == ERROR_TIMEOUT) {
                    showError(null);
                }
            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();//接受证书
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                Log.d(TAG, "开始加载");
                if (loadService != null && loadService.getCurrentCallback() == LoadingCallback.class) {

                } else {
                    showLoading();
                }
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                Log.d(TAG, "加载结束");
                hideLoading();
                if (loadService != null && loadService.getCurrentCallback() == LoadingCallback.class) {
                    showSuccess();
                }
            }

            // 链接跳转都会走这个方法
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url == null) return false;
                if (url.startsWith("http:") || url.startsWith("https:")) {
                    WebViewActivity.this.url = url;
                    view.loadUrl(url);
                    return false;
                } else {
                    try {
                        //取消打开应用
//                        Intent intent = new Intent(Intent.ACTION_VIEW);
//                        intent.setData(Uri.parse(url));
//                        startActivity(intent);
                    } catch (Exception e) {
//                        ToastUtils.showShort("暂无应用打开此链接");
                    }
                    return true;
                }
            }
        });

        webview.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                Log.d(TAG, "newProgress：" + newProgress);
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                WebViewActivity.this.title = title;
                Log.d(TAG, "标题：" + title);
                setMyTitle(title);
            }
        });
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
            webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void showError(ServerException exception) {
        if (loadService != null && loadService.getCurrentCallback() != ErrorCallback.class) {
            super.showError(exception);
        }
    }

    @Override
    public void onDestroy() {
        if (webview != null) {

            ViewParent parent = webview.getParent();
            if (parent != null) {
                ((ViewGroup) parent).removeView(webview);
            }
            webview.stopLoading();
            // 退出时调用此方法，移除绑定的服务，否则某些特定系统会报错
            webview.getSettings().setJavaScriptEnabled(false);
            webview.clearHistory();
            webview.clearView();
            webview.removeAllViews();
            webview.destroy();

        }
        super.onDestroy();
    }

}
